package qualomelhor.server;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.net.URLEncoder;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import qualomelhor.database.*;
import qualomelhor.database.ParametrosSistema.SiteHost;
import qualomelhor.database.ParametrosSistema.OrigemLogin;
import qualomelhor.util.Util;

public final class ControleServlet implements Filter {

	public void init(FilterConfig filterConfig)	throws ServletException {
		//this.filterConfig = filterConfig;

		System.out.println("Iniciando aplicacao!");
		DAO d = new DAO();

		ParametrosSistema sistema = null;
		sistema = d.getSistema();

		if (sistema == null) {
			sistema = new ParametrosSistema();
			d.gravaNovoSistema(sistema);
			sistema = d.getSistema();
			System.out.println("Sistema criado:[" + sistema.getId() + "]");

		} else {
			System.out.println("Sistema já existia!");
		}

		Categoria cPendente = d.getCategoriaByName("PENDENTE");
		if (cPendente == null) {
			HashMap<String, String> mapLocale_Name = new HashMap<String, String>(0);
			mapLocale_Name.put("pt_BR", "SEM CATEGORIA");
			mapLocale_Name.put("en_US", "UNCATEGORIZED");
			mapLocale_Name.put("default", "UNCATEGORIZED");
			d.gravaNovaCategoria(new Categoria("PENDENTE", true, null, (byte)0, "", "", 0, new Date()), mapLocale_Name);
		}

		Usuario userAnomimo = d.getUsuario("anonimo@anonimo.com");
		if (userAnomimo == null) {
			Usuario u = new Usuario("anonimo@anonimo.com", "", OrigemLogin.SITE.getSiteOrigem(), "", "", "Anonimo", "Sao Paulo", "SP", "pt-BR", "", true, "", new Date());
			if (d.gravaNovoUsuario(u)) {
				System.out.println("Conseguiu gravar...");
			}
			Usuario us = d.getUsuario("anonimo@anonimo.com");
			if (us != null) {
				System.out.println("Usuario criado:[" + u.getId() + "]");	
			} else {
				System.out.println("Tentou mas nao conseguiu gravar...");
			}

		} else {
			System.out.println("Usuario anonimo ja existia!" + userAnomimo.getId());
		}
	}

	public void destroy() {
		//this.filterConfig = null;
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
										throws IOException, ServletException {

		String uri = ((HttpServletRequest)request).getRequestURI();
		System.out.println("Controle chamado!");
		
		//verificar se eh secure
		if (uri.indexOf("/secure/") == 0) {
			uri = uri.substring(7);
			System.out.println("Secure Request ajustado:[" + uri + "]");
		}

		
		System.out.println("Request:[" + uri + "]");
		if (uri.equals("/")) {
			uri = "/ultimasComparacoes";
		}

		// tira a barra do fim se houver
		if (uri.charAt(uri.length() - 1) == '/') {
			uri = uri.substring(0, uri.length() - 1);
		}

		//System.out.println("Url:[" + uri.substring(6, uri.length()) + "]");

		if (uri.indexOf("/loginFB") == 0) {
			String accessT = request.getParameter("access_token");
			if (accessT != null) {
				request.setAttribute("access_token", accessT);	
			}
			redirectToAnotherServlet("qualomelhor.server.LoginFBServlet", request, response);
		} else if (uri.indexOf("/loginTwitter") == 0) {
			redirectToAnotherServlet("qualomelhor.server.LoginTwitterServlet", request, response);
		} else if (uri.indexOf("/callbackTwitter") == 0) {
			redirectToAnotherServlet("qualomelhor.server.CallbackTwitterServlet", request, response);
		} else if (uri.indexOf("/loginOpenId") == 0) {
			redirectToAnotherServlet("qualomelhor.server.LoginOpenIdServlet", request, response);
		} else if (uri.indexOf("/loginOpenRedirect") == 0) {
			redirectToAnotherServlet("qualomelhor.server.LoginOpenIdRedirectServlet", request, response);
		} else if (uri.indexOf("/callbackOpenId") == 0) {
			redirectToAnotherServlet("qualomelhor.server.CallbackOpenIdServlet", request, response);
		} else if (uri.indexOf("/sendfeedfb") == 0) {
			redirectToAnotherServlet("qualomelhor.server.FeedFBServlet", request, response);
		} else if (uri.indexOf("/img/") == 0) {
			request.setAttribute("idLinkBlob", uri.split("/")[2]);
			redirectToAnotherServlet("qualomelhor.server.ExibeImagemServlet", request, response);
		} else if (uri.indexOf("/changelocale/") == 0) {
			request.setAttribute("locale", uri.split("/")[2]);
			redirectToAnotherServlet("qualomelhor.server.ChangeLocaleServlet", request, response);
		} else if (uri.indexOf("/enviaremails") == 0) {
			redirectToAnotherServlet("qualomelhor.server.EnviaEmail", request, response);
		} else if (uri.indexOf("/limpasessao") == 0) {
			redirectToAnotherServlet("qualomelhor.server.SessionCleanupServlet", request, response);
		} else if (uri.indexOf("/limpasessaotudo") == 0) {
			redirectToAnotherServlet("qualomelhor.server.SessionCleanupTudoServlet", request, response);
		} else if (uri.indexOf("/logout") == 0) {
			redirectToAnotherServlet("qualomelhor.server.LogoutServlet", request, response);
		} else if (uri.indexOf("/testUrlFetch") == 0) {
			request.setAttribute("url", request.getParameter("url"));
			redirectToAnotherServlet("qualomelhor.server.TestUrlFetchServlet", request, response);
		} else {

			RequestDispatcher d = null;
			if (uri.indexOf(".html") == -1 && uri.indexOf(".jsp") == -1 && uri.indexOf("iSessionSuport") == -1 && uri.indexOf(".ico") == -1 && uri.indexOf(".png") == -1 && uri.indexOf(".css") == -1) {

				HttpSession session = ((HttpServletRequest)request).getSession(true);
				@SuppressWarnings("unchecked")
				HashMap<String, Object> mapSession = (HashMap<String, Object>)session.getAttribute("SESSIONVAR");
				if (mapSession == null) {
					mapSession = new HashMap<String, Object>(0);
					int numBackgrounds = 7;
					String backgroundUrl = "/images/background/fundo" + ((int)(Math.floor(Math.random() * (numBackgrounds - 1)) + 1)) + ".jpg";
					mapSession.put("BACKGROUND", backgroundUrl);
					session.setAttribute("BACKGROUND", backgroundUrl);
				}
				//session.setMaxInactiveInterval(10000);
				DAO dao = new DAO();

				if (session.getAttribute("sistema") == null) {
					ParametrosSistema sistema = dao.getSistema();
					session.setAttribute("sistema", sistema);
				}

				// busca strLocale na sessao e caso esteja vazia seta pela lista de criterios
				// outra url permitira a alteracao do idioma
				String strLocale = (String)session.getAttribute("LOCALE");

				if (strLocale == null || strLocale.equals("") || strLocale.equals("default")) {
					if (request.getParameter("locale") != null) {
						// locale especificada no link tem preferencia 1
						strLocale = request.getParameter("locale");
						System.out.println("parametro Locale em controle servlet = " + strLocale);
					}
				}
				if (strLocale == null || strLocale.equals("") || strLocale.equals("default")) {
					// locale especificada pelo host de acesso link tem preferencia 2
					SiteHost site = ParametrosSistema.SiteHost.getSiteHostPerHost(request.getServerName());
					strLocale = site.getLocale()[0]; // pega a primeira locale que eh a principal

					//Verifica se a locale do browser está contida na locale do host e use caso encontrada.
					String localeBrowser = request.getLocale().toString();
					if (localeBrowser != null && !localeBrowser.equals("") && !strLocale.equals("default")) {
						System.out.println("localeBrowser = " + localeBrowser);
						for (int i = 0; i < site.getLocale().length; i++) {
							if (site.getLocale()[i].equals(localeBrowser)) {
								System.out.println("localeBrowser encontrado na lista dos locales do host!");
								strLocale = localeBrowser;
							}
						}
					}
				}
				if (strLocale == null || strLocale.equals("") || strLocale.equals("default")) {
					// locale especificada pelo browser (request.getLocale()) tem preferencia 3
					strLocale = request.getLocale().toString();
				}

				System.out.println("locale em controle servlet = " + strLocale);
				mapSession.put("LOCALE", strLocale);
				session.setAttribute("LOCALE", strLocale);

				/*
				Boolean bot = (Boolean)session.getAttribute("BOT");
				if (bot == null) {
					String userAgent = ((HttpServletRequest)request).getHeader("user-agent");
					if (userAgent.matches("/googlebot|msnbot|baidu|curl|wget|Mediapartners-Google|slurp|ia_archiver|Gigabot|libwww-perl|lwp-trivial/i")) {
						bot = true;
						System.out.println("eh um bot que visitou..");
					} else {
						System.out.println("NAO eh um bot que visitou..");
						bot = false;
					}
					session.setAttribute("BOT", bot);
					mapSession.put("BOT", bot);
				}
				*/
				session.setAttribute("SESSIONVAR", mapSession);

				if (uri.indexOf("/criar-comparacao-2-itens") == 0) {
					d = request.getRequestDispatcher("/comparacao.jsp?tipo=2&locale=" + strLocale);
				} else if (uri.indexOf("/testegame2") == 0) {
					//d = request.getRequestDispatcher("/indexFullScreen.jsp?tipo=4&locale=" + strLocale);
					d = request.getRequestDispatcher("/indexFullScreen.jsp?pagina=testegame2&locale=" + strLocale);
				} else if (uri.indexOf("/testegame") == 0) {
					//d = request.getRequestDispatcher("/indexFullScreen.jsp?tipo=4&locale=" + strLocale);
					d = request.getRequestDispatcher("/indexFullScreen.jsp?pagina=testegame&locale=" + strLocale);
				} else if (uri.indexOf("/simplegame") == 0) {
					//d = request.getRequestDispatcher("/indexFullScreen.jsp?tipo=4&locale=" + strLocale);
					d = request.getRequestDispatcher("/indexFullScreen.jsp?pagina=simplegame&locale=" + strLocale);
				} else if (uri.indexOf("/contato") == 0) {
					//d = request.getRequestDispatcher("/indexFullScreen.jsp?tipo=4&locale=" + strLocale);
					d = request.getRequestDispatcher("/indexFullScreen.jsp?pagina=contato&locale=" + strLocale);
				} else if (uri.indexOf("/editar") == 0) {
					d = request.getRequestDispatcher("/indexFullScreenAdmin.jsp?pagina=" + uri.substring(1) + "&locale=" + strLocale);
				} else if (uri.indexOf("/testelogin") == 0) {
					d = request.getRequestDispatcher("/loginFB.jsp?locale=" + strLocale);
				} else if (uri.indexOf("/testeBusca") == 0) {
					d = request.getRequestDispatcher("/index.jsp?pagina=testebusca&locale=" + strLocale);
				} else if (uri.indexOf("/mensagemErro") == 0) { 
					d = request.getRequestDispatcher("/index.jsp?pagina=mensagem&msg=" + URLEncoder.encode(request.getParameter("msg"), "UTF-8"));
				} else if (uri.indexOf("/criar-comparacao-multi") == 0) {
					d = request.getRequestDispatcher("/comparacao.jsp?tipo=3&locale=" + strLocale);
				} else if (uri.indexOf("/criar-comparacao-1-item") == 0) {
					d = request.getRequestDispatcher("/comparacao.jsp?tipo=1&locale=" + strLocale);
				} else if (uri.indexOf("/minilink/") == 0) {
					String link = "/minilink.jsp?comp=" + uri.split("/")[2] + "&locale=" + strLocale;
					System.out.println("minilink = [" + link + "]");
					d = request.getRequestDispatcher(link);
				} else if (uri.indexOf("/microlink/") == 0) {
					String link = "/microlink.jsp?comp=" + uri.split("/")[2] + "&locale=" + strLocale;
					System.out.println("microlink = [" + link + "]");
					d = request.getRequestDispatcher(link);
				} else if (uri.indexOf("/biglink/") == 0) {
					String link = "/biglink.jsp?comp=" + uri.split("/")[2] + "&locale=" + strLocale;
					System.out.println("biglink = [" + link + "]");
					d = request.getRequestDispatcher(link);
				} else if (uri.indexOf("/noavatarlink/") == 0) {
					String link = "/noavatarlink.jsp?comp=" + uri.split("/")[2] + "&locale=" + strLocale;
					System.out.println("noavatarlink = [" + link + "]");
					d = request.getRequestDispatcher(link);
				} else if (uri.indexOf("/updateYourBrowser") == 0) {
					d = request.getRequestDispatcher("/indexFullScreen.jsp?pagina=updateYourBrowser&locale=" + strLocale);					
				} else if (uri.indexOf("/categoria/") == 0) {
					String[] categoria = separaUri(uri.substring(1));
					System.out.println("uri[0] = " + categoria[0]);
					System.out.println("uri[1] = " + categoria[1]);
					if (!categoria[1].equals("")) {
						categoria[1] = categoria[1].substring(0, categoria[1].length() - 1);
						Categoria c;
						if (Util.isNumeric(categoria[1])) {
							c = dao.getCategoria(Long.valueOf(categoria[1].substring(0, categoria[1].length() - 1)));
						} else {
							c = dao.getCategoriaByName(Util.converteEmTexto(categoria[1]));
							System.out.println("Util.converteEmTexto(categoria[1]) = " + Util.converteEmTexto(categoria[1]));
						}

						System.out.println("Categoria.nome = " + c.getNomeCategoria());
						session.setAttribute("paginaAtual", "Categoria: " + c.getNomeCategoria());
						d = request.getRequestDispatcher("/index.jsp?pagina=categoria&idcategoria=" + c.getId() + "&keywords=" + URLEncoder.encode(c.getNomeCategoria(), "UTF-8") + "&locale=" + strLocale);
					} else {
						d = request.getRequestDispatcher("/index.jsp?pagina=escolhercategoria&locale=" + strLocale);
					}
				} else if (uri.indexOf("/produto/") == 0) {
					String[] produto = separaUri(uri.substring(1));
					System.out.println("produto[0] = " + produto[0]);
					System.out.println("produto[1] = " + produto[1]);
					String nomeProduto = "";
					if (Util.isNumeric(produto[1])) {
						Produto p = dao.getProduto(Long.valueOf(produto[1].substring(0, produto[1].length() - 1)));
						System.out.println("Produto.nome = " + p.getNomeProduto());
						nomeProduto = p.getNomeProduto();
					} else {
						if (produto.length > 0 && produto[1].length() > 0) {
							nomeProduto = Util.converteEmTexto(produto[1].substring(0, produto[1].length() - 1));
						}
					}
					session.setAttribute("paginaAtual", nomeProduto);
					if (nomeProduto.equals("")) {
						d = request.getRequestDispatcher("/index.jsp?pagina=mensagem&msg=" + URLEncoder.encode(Util.getConstant("Produto nao encontrado", strLocale), "UTF-8"));
					} else {
						d = request.getRequestDispatcher("/index.jsp?pagina=produto&idproduto=" + URLEncoder.encode(nomeProduto, "UTF-8") + "&keywords=" + URLEncoder.encode(nomeProduto, "UTF-8") + "&locale=" + strLocale);
					}

				} else if (uri.indexOf("/comparacao/") == 0) {
					String[] comparacao = separaUri(uri.substring(1));
					System.out.println("comparacao[0] = " + comparacao[0]);
					System.out.println("comparacao[1] = " + comparacao[1]);
					
					if (Util.isNumeric(comparacao[1].substring(0, comparacao[1].length() - 1))) {
						Long idComp = Long.parseLong(comparacao[1].substring(0, comparacao[1].length() - 1));
						d = request.getRequestDispatcher("/detalheComparacao.jsp?idcomparacao=" + idComp + "&locale=" + strLocale);
					} else {
						LinkComparacao link = dao.getLinkComparacao(comparacao[1].substring(0, comparacao[1].length() - 1), SiteHost.getSiteHostPerHost(request.getServerName()));
						if (link != null) {
							System.out.println("Link.url = " + link.getLink());
							System.out.println("Link.idComparacao = " + link.getIdComparacao());
							String newParam = "";
							if (request.getParameter("new") != null) {
								newParam = "&new=true";
							}
							System.out.println("newParam = " + newParam);

							session.setAttribute("paginaAtual", link.getLink());
							d = request.getRequestDispatcher("/detalheComparacao.jsp?idcomparacao=" + link.getIdComparacao() + "&link=" + URLEncoder.encode(link.getLink(), "UTF-8") + newParam + "&locale=" + strLocale);
						} else {
							d = request.getRequestDispatcher("/index.jsp?pagina=mensagem&msg=" + URLEncoder.encode(Util.getConstant("Não foi possível abrir a comparação! Lamentamos o inconveniente!", strLocale), "UTF-8") + "&locale=" + strLocale);
						}
					}

				} else if (uri.indexOf("/busca") == 0) {
					String[] busca = separaUri(uri.substring(1));
					System.out.println("busca[0] = " + busca[0]);
					System.out.println("busca[1] = " + busca[1]);
					session.setAttribute("paginaAtual", "Busca");
					d = request.getRequestDispatcher("/index.jsp?pagina=produtoBusca&partenome=" + busca[1].substring(0, busca[1].length() - 1) + "&locale=" + strLocale);
				} else if (uri.indexOf("confirmar") == 0) {
					String[] confirmar = separaUri(uri);
					System.out.println("confirmar[0] = " + confirmar[0]);
					System.out.println("confirmar[1] = " + confirmar[1]);
					session.setAttribute("paginaAtual", "Digital Delivery");
					d = request.getRequestDispatcher("/index.jsp?pagina=confirmar&" + confirmar[1].substring(0, confirmar[1].length() - 1) + "&locale=" + strLocale);
				} else if (uri.indexOf("/fbobject") == 0) {
					String[] fbObject = separaUri(uri.substring(1));
					System.out.println("fbObject[0] = " + fbObject[0]);
					System.out.println("fbObject[1] = " + fbObject[1]);
					d = request.getRequestDispatcher("/fbobject.jsp?link=" + fbObject[1].substring(0, fbObject[1].length() - 1));
				} else if (uri.indexOf("/imagefbobject") == 0) {
					String[] imagefbObject = separaUri(uri.substring(1));
					System.out.println("imagefbObject[0] = " + imagefbObject[0]);
					System.out.println("v[1] = " + imagefbObject[1]);
					d = request.getRequestDispatcher("/imagefbobject.jsp?link=" + imagefbObject[1].substring(0, imagefbObject[1].length() - 1));

				} else {

					//remover a barra se estiver no fim da sequencia					
					if (uri.charAt(uri.length() - 1) == '/') {
						uri = uri.substring(0, uri.length() - 1);
					}

					//tentar achar a comparacao
					LinkComparacao linkComparacao = dao.getLinkComparacao(uri.substring(1), SiteHost.getSiteHostPerHost(request.getServerName()));

					if (linkComparacao != null) {
						System.out.println("Link.url = " + linkComparacao.getLink());
						System.out.println("Link.idComparacao = " + linkComparacao.getIdComparacao());

						//session.setAttribute("paginaAtual", linkComparacao.getLink());
						d = request.getRequestDispatcher("/detalheComparacao.jsp?idcomparacao=" + linkComparacao.getIdComparacao() + "&link=" + URLEncoder.encode(linkComparacao.getLink(), "UTF-8") + "&locale=" + strLocale);

					} else {
						// tenta achar uma categoria
						System.out.println("Link comparacao NAO encontrado.. Procurando categoria ou produto = [" + uri + "], locale:[" + strLocale + "]");
						LinkCategoria_Produto link = dao.getLinkCategoria_Produto(uri, strLocale);

						if (link != null) {
							System.out.println("Link.url = " + link.getLink());
							System.out.println("Link.idCategoria = " + link.getIdCategoria());

							if (link.getIdCategoria() != null && link.getIdCategoria() != 0) {
								Categoria c = dao.getCategoria(link.getIdCategoria());
								System.out.println("Categoria.nome = " + c.getNomeCategoria());
								session.setAttribute("paginaAtual", c.getNomeCategoria(strLocale));
								d = request.getRequestDispatcher("/index.jsp?pagina=categoria&idcategoria=" + c.getId() + "&idcategoriapai=" + c.getCategoriaPai() + "&keywords=" + URLEncoder.encode(c.getNomeCategoria(), "UTF-8") + "&locale=" + strLocale);

							} else if (link.getIdProduto() != null && link.getIdProduto() != 0) {
								System.out.println("Produto encontrado: [" + link.getIdProduto() + "]");
								Produto prod = dao.getProduto(link.getIdProduto());
								if (prod == null || prod.getNomeProduto() == null) {
									d = request.getRequestDispatcher("/index.jsp?pagina=mensagem&msg=" + URLEncoder.encode(Util.getConstant("Item não encontrado. Lamentamos o inconveniente.", strLocale), "UTF-8") + "&locale=" + strLocale);
								} else {
									session.setAttribute("paginaAtual", prod.getNomeProduto());
									d = request.getRequestDispatcher("/index.jsp?pagina=produto&idproduto=" + prod.getId() + "&idcategoriapai=" + prod.getIdCategoria() + "&keywords=" + URLEncoder.encode(prod.getNomeProduto(), "UTF-8") + "&locale=" + strLocale);
								}
							} else {
								System.out.println("nao pode chegar aqui!!!!!!!!!!!!1");
							}
						} else {
							System.out.println("entrou no index.jsp direto: [" + uri.substring(1, uri.length()) + "]");
							
							if (uri.indexOf("/ultimasComparacoes") == 0) {
								SiteHost site = ParametrosSistema.SiteHost.getSiteHostPerHost(request.getServerName());
								session.setAttribute("paginaAtual", site.getPergunta() + "! " + Util.getConstant("Faça comparações ou pesquisas para promover seu site ou blog!", strLocale));
							} else if (uri.indexOf("/escolhercategoria") == 0) {
								//SiteHost site = ParametrosSistema.SiteHost.getSiteHostPerHost(request.getServerName());
								session.setAttribute("paginaAtual", Util.getConstant("Escolha a categoria", strLocale));								
							} else {
								session.setAttribute("paginaAtual", "URI:[" + uri + "]");
							}
							d = request.getRequestDispatcher("/index.jsp?pagina=" + uri.substring(1, uri.length()) + "&locale=" + strLocale);
						}
					} // end if linkEncontrado else
				}

			} else {

				//imagem ou resource qualquer (jpg, png, etc..)
				d = request.getRequestDispatcher(uri);
			}
			d.forward(request, response);
		}
	}

	private String[] separaUri(String uri) {
		String[] result = new String[2];
		String ultimaPosicao = uri.substring(uri.length() - 1, uri.length());
		if (!ultimaPosicao.equals("/")) {
			uri += "/";
		}

		System.out.println("pos da / = " + uri.indexOf("/", 1));
		result[0] = uri.substring(0, uri.indexOf("/"));

		System.out.println("result[0] = [" + result[0] + "]");
		if (uri.length() > uri.indexOf("/")) {
			result[1] = uri.substring(uri.indexOf("/") + 1, uri.length());	
		}

		System.out.println("Resto = [" + result[1] + "]");

		return result;
	}

	private void redirectToAnotherServlet(String servletPackage, ServletRequest request, ServletResponse response) throws ServletException, IOException {

		Class<?> clazz = null;
		try {
			clazz = Class.forName(servletPackage);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		Servlet objServlet = null;

		try {
			objServlet = (Servlet)clazz.newInstance();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}

		objServlet.init(new ServletConfig() {
			@Override
			public String getServletName() {
				return null;
			}

			@Override
			public ServletContext getServletContext() {
				return null;
			}

			@Override
			public Enumeration<?> getInitParameterNames() {
				return null;
			}

			@Override
			public String getInitParameter(String arg0) {
				return null;
			}
		});

		System.out.println("redirecionando para servlet instanciado manualmente... ");
		objServlet.service(request, response);
	}
}